package com.haochu.novel.util;

import java.util.List;

import android.content.Context;
import android.os.Bundle;
import android.util.Log;

import com.haochu.novel.ui.BookContentActivity;
import com.haochu.novel.ui.BookFactory;
import com.iflytek.cloud.ErrorCode;
import com.iflytek.cloud.InitListener;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechSynthesizer;
import com.iflytek.cloud.SpeechUtility;
import com.iflytek.cloud.SynthesizerListener;

/**
 * @author fuhuichao
 * 2017年6月24日15:55:20
 * 讯飞语音合成工具
 */
public class SpeekUitl {

	// 讯飞APPID
	private static final String APPID = "594e1297";
	// TTS工具对象
	private SpeechSynthesizer tts;
	// activity上下文
	private Context context;
	BookContentActivity bookContentActivity;
	// 文字工厂工具类
	private BookFactory bookFactory;
	// 本页文字行数
	private List<String> lines;
	// 本页已合成文字行数下标
	private int index = 0;
	private int index_ = 0;
	// 本次合成的文字段落
	private String words;
	
	/**
	 * 构造方法，初始化参数
	 */
	public SpeekUitl(Context context, BookFactory bookFactory) {
		this.bookContentActivity = (BookContentActivity) context;
		this.context = context;
		this.bookFactory = bookFactory;
		this.tts = initTTS();
		setTtsParam();
	}
	
	/**
	 * 合成参数设置
	 */
	private void setTtsParam(){
		tts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");// 设置发音人
		tts.setParameter(SpeechConstant.SPEED, "100");// 设置语速
		tts.setParameter(SpeechConstant.VOLUME, "80");// 设置音量，范围0~100
//        tts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_LOCAL); // 设置云端
        tts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); // 设置云端
	}
	
	/**
	 * 初始化
	 */
	public SpeechSynthesizer initTTS(){
		SpeechUtility.createUtility(context, SpeechConstant.APPID + "=" + APPID + "," + SpeechConstant.FORCE_LOGIN +"=true");
		return SpeechSynthesizer.createSynthesizer(context, mTtsInitListener);
	}
	
	/**
	 * 初始化方法监听
	 */
	private InitListener mTtsInitListener = new InitListener() {
        @Override
        public void onInit(int code) {
            Log.d("iiii", "InitListener init() code = " + code);
            if (code != ErrorCode.SUCCESS) {
//                 showTip("初始化失败,错误码：" + code);
            } else {
                // 初始化成功，之后可以调用startSpeaking方法
                // 注：有的开发者在onCreate方法中创建完合成对象之后马上就调用startSpeaking进行合成，
                // 正确的做法是将onCreate中的startSpeaking调用移至这里
            }
        }
    };
	
	/**
	 * 开始合成
	 */
	public void startSpeaking(){
		// 获取本页文字
		lines = bookFactory.getLines();
		words = "";
		
		// 获取一个段落
		index_ = index;
		while (index < lines.size()) {
			words += lines.get(index);
			index++;
			if (words.endsWith("\n")) {
				break;
			}
		}

		// 开始朗读
		tts.startSpeaking(words, mTtsListener);

		// 本页读完，自动翻页
		if (index >= lines.size()) {
			index = 0;
			bookContentActivity.doPageNext();
		}
	}
	
	/**
	 * 停止合成
	 */
	public void stopSpeaking(){
		if(tts.isSpeaking()){
			tts.stopSpeaking();
			index = index_;
		}
	}
	
	/**
	 * 翻页后重置行数下标
	 */
	public void resetIndex(){
		index = 0;
	}
	
	/**
	 * 合成回调监听
	 */
	private SynthesizerListener mTtsListener = new SynthesizerListener() {
		
		@Override
		public void onSpeakBegin() {
		}

		@Override
		public void onSpeakPaused() {
		}

		@Override
		public void onSpeakResumed() {
		}

		@Override
		public void onBufferProgress(int percent, int beginPos, int endPos, String info) {
		}

		@Override
		public void onSpeakProgress(int percent, int beginPos, int endPos) {
		}

		@Override
		public void onCompleted(SpeechError error) {
			if (error == null) {
				startSpeaking();
			} else if (error != null) {
				Log.d("iiii", error.getPlainDescription(true));
			}
		}

		@Override
		public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
			// 以下代码用于获取与云端的会话id，当业务出错时将会话id提供给技术支持人员，可用于查询会话日志，定位出错原因
			// 若使用本地能力，会话id为null
			//	if (SpeechEvent.EVENT_SESSION_ID == eventType) {
			//		String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);
			//		Log.d(TAG, "session id =" + sid);
			//	}
		}
	};
	
}
